import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Vector;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
public class Gui extends JFrame
{
////////////////////// Objects /////////////////////////
//JDialog j;
//////// Menu ////////
JMenuBar menu_bar;
JMenu menu_file;
JMenuItem file_open, file_exit;
JMenu menu_edit;
JMenuItem edit_fix_all , edit_tag, edit_delete, edit_select_all, edit_clean;
final JFileChooser filechooser = new JFileChooser();
//////// Table_Panel /////////
JPanel table_panel,button_panel;
//JTextArea table_log;
JProgressBar progress_bar;
JScrollPane table_panel_scroll;//,table_log_scroll;
JButton autofix_button,saveimage_button,rename_button,synchronize,auto_rename;
JFileChooser savedialog;
JTable table_panel_table;
String[] categories = { "File Name","Title", "Artist", "Album", "Release Year", "Comment" };
Object[][] data = { };
JPopupMenu popup;
JMenuItem popup_fixall, popup_tag, popup_delete, popup_selectall, popup_clean;
int selectedRows[];
int selectedRowCount;
int currentRowIndex;
//////// Side_Panel /////////
JPanel side_panel,album_panel,lyrics_panel;
BufferedImage default_cover, cover;
JLabel album_title,lyrics_title;
JLabel album_art;
JScrollPane side_panel_scroll;
JTextArea lyrics_field;
String Lyrics;
///// ID3V1 /////
JLabel Label_Title_ID3V1;
JLabel Label_Year_ID3V1;
JLabel Label_Artist_ID3V1;
//JLabel Label_Composer_ID3V1;
JLabel Label_Album_ID3V1;
JLabel Label_Comment_ID3V1;
JLabel Label_Genre_ID3V1;
final JTextField Text_Title_ID3V1 = new JTextField( );
final JTextField Text_Year_ID3V1 = new JTextField( );
final JTextField Text_Artist_ID3V1 = new JTextField( );
//final JTextField Text_Composer_ID3V1 = new JTextField( );
final JTextField Text_Album_ID3V1 = new JTextField( );
final JTextField Text_Comment_ID3V1 = new JTextField( );
final JTextField Text_Genre_ID3V1 = new JTextField( );
JButton fix_ID3V1;
JButton reset_ID3V1;
///// ID3V1 /////
JLabel Label_Title_ID3V2;
JLabel Label_Year_ID3V2;
JLabel Label_Artist_ID3V2;
//JLabel Label_Composer_ID3V2;
JLabel Label_Album_ID3V2;
JLabel Label_Comment_ID3V2;
JLabel Label_Genre_ID3V2;
final JTextField Text_Title_ID3V2 = new JTextField( );
final JTextField Text_Year_ID3V2 = new JTextField( );
final JTextField Text_Artist_ID3V2 = new JTextField( );
//final JTextField Text_Composer_ID3V2 = new JTextField( );
final JTextField Text_Album_ID3V2 = new JTextField( );
final JTextField Text_Comment_ID3V2 = new JTextField( );
final JTextField Text_Genre_ID3V2 = new JTextField( );
JButton fix_ID3V2;
JButton reset_ID3V2;
//////// MP3_FILE /////////
Vector <MP3FILE> filevector;
static boolean singleton = false;
static Gui gui = null;
// getter method for Frame_Gui
public static Gui getGui()
{
if( !singleton ){
singleton = true;
gui = new Gui();
}
return gui;
}
//////////////// Constructor ////////////////
private Gui()
{
super();
constructTablePanel();
constructSidePanel();
constructMenu();
constructFrame();
}
//////////////// Helper Constructors ////////////////
private void constructMenu()
{
menu_bar = new JMenuBar();
createFileMenu();
createEditMenu();
}
private void constructTablePanel()
{
//j = new JDialog(this, "Tag Fixing.... please wait");
table_panel_table = new JTable( new DefaultTableModel( data, categories ) ){
//Disallow the editing of any cell
public boolean isCellEditable(int rowIndex, int colIndex) {
return false;
}
};
table_panel_table.setCellSelectionEnabled(false);
table_panel_table.setRowSelectionAllowed(true);
table_panel_scroll = new JScrollPane( table_panel_table );
table_panel = new JPanel( new BorderLayout() );
table_panel.add( table_panel_scroll, BorderLayout.CENTER );
progress_bar = new JProgressBar(0,100);
progress_bar.setPreferredSize(new Dimension(50,35));
//pb.setSize(200, 100);
progress_bar.setString("Welcome To Music Tagger");
progress_bar.setStringPainted(true);
progress_bar.setVisible(true);
progress_bar.setValue(0);
table_panel.add(progress_bar,BorderLayout.SOUTH);
//table_log = new JTextArea();
//table_log_scroll = new JScrollPane( table_log );
//table_panel.add(table_log_scroll,BorderLayout.SOUTH);
autofix_button = new JButton(new ImageIcon("autofix.jpg"));
saveimage_button = new JButton(new ImageIcon("save.jpg"));
rename_button = new JButton(new ImageIcon("rename.jpg"));
synchronize = new JButton(new ImageIcon("transfer.jpg"));
auto_rename = new JButton(new ImageIcon("auto_rename.jpg"));
button_panel = new JPanel( new FlowLayout(FlowLayout.LEFT));
button_panel.add(autofix_button);
button_panel.add(saveimage_button);
button_panel.add(rename_button);
button_panel.add(auto_rename);
button_panel.add(synchronize);
table_panel.add(button_panel,BorderLayout.NORTH);
createPopup();
autofix_button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
//j.setVisible(true);
System.out.println("Auto Fixing....");
int totalRows = table_panel_table.getRowCount();
progress_bar.setString("auto batch fixing...");
progress_bar.update(progress_bar.getGraphics());
for ( int row = 0; row < totalRows; row++ ){
try{
filevector.get(row).get_correct_tag();
update( row );
}catch( Exception E ){
E.printStackTrace();
}
System.out.println((int)((row+1)/(double)totalRows*100));
//progress_bar.setVisible(true);
progress_bar.setValue((int)((row+1)/(double)totalRows*100));
progress_bar.update(progress_bar.getGraphics());
}
progress_bar.setString("Auto Fixing Done");
progress_bar.setValue(0);
progress_bar.update(progress_bar.getGraphics());
refreshID3v1();
refreshID3v2();
refreshCover();
refreshLyrics();
//j.setVisible(false);
}
});
savedialog = new JFileChooser();
saveimage_button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if( default_cover != cover ){
savedialog.setSelectedFile(new File("untitle.jpg"));
int retval = savedialog.showSaveDialog(saveimage_button);
if( retval == JFileChooser.APPROVE_OPTION ){
File savefile = savedialog.getSelectedFile();
try{
ImageIO.write(cover,"jpg",savefile);
}catch( IOException e1 ){
}
}
}
}
});
auto_rename.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
for( int index = 0 ; index < filevector.size() ; index++ ){
File oldfile = filevector.get(index).mp3_file.getMp3file();
String oldname = oldfile.getName();
String directory = oldfile.getParent();
String newname = filevector.get(index).id3v2tag.getSongTitle();
newname = newname + ".mp3";
BufferedImage image = filevector.get(index).cover;
String Ly = filevector.get(index).lyrics;
//= JOptionPane.showInputDialog(table_panel, "rename to :", oldname,JOptionPane.QUESTION_MESSAGE);
if( newname.compareTo(oldname) != 0 ){
//if( newname.endsWith(".mp3") ){
System.out.println("rename processing..");
File newfile = new File(directory + "/"+newname);
oldfile.renameTo(newfile);
try{
MP3FILE temp = temp = new MP3FILE(newfile,image,Ly);
filevector.set(index, temp);
refreshID3v1();
refreshID3v2();
refreshLyrics();
refreshCover();
}catch(Exception e3){
}
//}
}
update(index);
}
}
});
rename_button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(selectedRowCount > 1){
JOptionPane.showMessageDialog(table_panel, "please select single file");
}else if(selectedRowCount == 1){
File oldfile = filevector.get(currentRowIndex).mp3_file.getMp3file();
String oldname = oldfile.getName();
String directory = oldfile.getParent();
String newname = JOptionPane.showInputDialog(table_panel, "rename to :", oldname,JOptionPane.QUESTION_MESSAGE);
BufferedImage image = filevector.get(currentRowIndex).cover;
String Ly = filevector.get(currentRowIndex).lyrics;
if( newname.compareTo(oldname) != 0 ){
if( newname.endsWith(".mp3") ){
System.out.println("rename processing..");
File newfile = new File(directory + "/"+newname);
oldfile.renameTo(newfile);
try{
MP3FILE temp = temp = new MP3FILE(newfile,image,Ly);
filevector.set(currentRowIndex, temp);
refreshID3v1();
refreshID3v2();
refreshLyrics();
refreshCover();
}catch(Exception e3){
}
}
}
update(currentRowIndex);
}
}
});
synchronize.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
Iterator<MP3FILE> iterate = filevector.iterator();
Vector<File> chosen_files = new Vector<File>();
while( iterate.hasNext() ){
MP3FILE m = iterate.next();
chosen_files.add(m.mp3_file.getMp3file());
}
transfer_frame f = new transfer_frame(chosen_files);
}
});
table_panel_scroll.addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e) {
Point point = e.getPoint();
if( !table_panel_table.contains(point) ){
table_panel_table.clearSelection();
}
}
});
table_panel_table.getSelectionModel().addListSelectionListener(new ListSelectionListener()
{
@Override
public void valueChanged(ListSelectionEvent e) {
// TODO Auto-generated method stub
System.out.println("row value change");
ListSelectionModel model = (ListSelectionModel)e.getSource();
selectedRowCount = table_panel_table.getSelectedRowCount();
if( selectedRowCount > 0 ){
currentRowIndex = model.getLeadSelectionIndex();
selectedRows = table_panel_table.getSelectedRows();
}else{
currentRowIndex = -1;
selectedRows = null;
}
System.out.println("lead selection:" + currentRowIndex);
refreshID3v1();
refreshID3v2();
refreshCover();
refreshLyrics();
}
});
table_panel_table.addMouseListener( new MouseAdapter()
{
public void mousePressed(MouseEvent e)
{
System.out.println("left click");
if (e.isPopupTrigger())
{
JTable source = (JTable)e.getSource();
int row = source.rowAtPoint( e.getPoint() );
int column = source.columnAtPoint( e.getPoint() );
//if no row is selected before right click or if the row at cursor position is not selected, then change selection
if( selectedRowCount <= 0 || !source.isRowSelected(row) ){
source.setRowSelectionInterval(row, row);
}
System.out.println("right click pressed");
popup.show(e.getComponent(),e.getX(),e.getY());
}
}
});
table_panel_table.getTableHeader().addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
table_panel_table.clearSelection();
int col = table_panel_table.getTableHeader().columnAtPoint(e.getPoint());
mp3structure[] list = new mp3structure[filevector.size()];
for( int i = 0 ; i < filevector.size() ; i++ ){
list[i] = new mp3structure(filevector.get(i).mp3_filename,filevector.get(i).id3v2tag.getSongTitle(),filevector.get(i).id3v2tag.getLeadArtist(),filevector.get(i).id3v2tag.getAlbumTitle(),filevector.get(i).id3v2tag.getYearReleased(),filevector.get(i));
}
switch(col){
case 0:
Arrays.sort(list,new comparefilename());
break;
case 1:
Arrays.sort(list,new comparetitle());
break;
case 2:
Arrays.sort(list,new compareartist());
break;
case 3:
Arrays.sort(list,new comparealbum());
break;
case 4:
Arrays.sort(list,new compareyear());
break;
}
for( int i = 0 ; i < filevector.size() ; i++ ){
filevector.set(i, list[i].mp3);
}
for( int i = 0 ; i < filevector.size() ; i++ ){
update(i);
}
}
});
}
private void constructSidePanel()
{
currentRowIndex = -1;
side_panel = new JPanel();
side_panel.setLayout(new GridLayout(3,1));
////////////////////////////////// Album Art ///////////////////////////////////////////
album_panel = new JPanel();
album_panel.setLayout( new BoxLayout( album_panel, BoxLayout.LINE_AXIS) );
// album_title = new JLabel("Album Arts\n",JLabel.CENTER);
try
{ default_cover = ImageIO.read(new File("default_cover.jpg")); }
catch (IOException e)
{ e.printStackTrace(); }
cover = default_cover;
album_art = new JLabel( new ImageIcon(cover) , JLabel.CENTER);
album_panel.add(album_art);
side_panel.add( album_panel );
///////////////////////////////// Tabbed Panel /////////////////////////////////////////
JTabbedPane tabPane = new JTabbedPane();
JPanel gridPane_ID3V1 = new JPanel( new GridLayout(6, 2) );
JPanel boxPane_ID3V1 = new JPanel( );
JPanel buttonPane_ID3V1 = new JPanel( );
JPanel gridPane_ID3V2 = new JPanel( new GridLayout(6, 2) );
JPanel boxPane_ID3V2 = new JPanel( );
JPanel buttonPane_ID3V2 = new JPanel( );
////////////////////////////////// ID3V1 ////////////////////////////////////////
Label_Title_ID3V1 = new JLabel( "Title" );
Label_Year_ID3V1 = new JLabel( "Year" );
Label_Artist_ID3V1 = new JLabel( "Artist" );
//Label_Composer_ID3V1 = new JLabel( "Composer" );
Label_Album_ID3V1 = new JLabel( "Album" );
Label_Comment_ID3V1 = new JLabel( "Comment" );
Label_Genre_ID3V1 = new JLabel( "Genre" );
fix_ID3V1 = new JButton( "Fix" );
reset_ID3V1 = new JButton( "Reset" );
reset_ID3V1.addActionListener(
new ActionListener(){
public void actionPerformed( ActionEvent e ){
// TODO reset to defaults
refreshID3v1();
}
});
gridPane_ID3V1.add( Label_Title_ID3V1 );
gridPane_ID3V1.add( Text_Title_ID3V1 );
gridPane_ID3V1.add( Label_Year_ID3V1 );
gridPane_ID3V1.add( Text_Year_ID3V1 );
gridPane_ID3V1.add( Label_Artist_ID3V1 );
gridPane_ID3V1.add( Text_Artist_ID3V1 );
//gridPane_ID3V1.add( Label_Composer_ID3V1 );
//gridPane_ID3V1.add( Text_Composer_ID3V1 );
gridPane_ID3V1.add( Label_Album_ID3V1 );
gridPane_ID3V1.add( Text_Album_ID3V1 );
gridPane_ID3V1.add( Label_Comment_ID3V1 );
gridPane_ID3V1.add( Text_Comment_ID3V1 );
gridPane_ID3V1.add( Label_Genre_ID3V1 );
gridPane_ID3V1.add( Text_Genre_ID3V1 );
JScrollPane scrollPane_ID3V1 = new JScrollPane( gridPane_ID3V1 );
buttonPane_ID3V1.setLayout( new BoxLayout( buttonPane_ID3V1, BoxLayout.LINE_AXIS) );
buttonPane_ID3V1.add( fix_ID3V1 );
buttonPane_ID3V1.add( reset_ID3V1 );
boxPane_ID3V1.setLayout( new BoxLayout( boxPane_ID3V1, BoxLayout.PAGE_AXIS) );
boxPane_ID3V1.add( scrollPane_ID3V1 );
boxPane_ID3V1.add( buttonPane_ID3V1 );
tabPane.add( "ID3V1" , boxPane_ID3V1 );
////////////////////////////////// ID3V2 ////////////////////////////////////////
Label_Title_ID3V2 = new JLabel( "Title" );
Label_Year_ID3V2 = new JLabel( "Year" );
Label_Artist_ID3V2 = new JLabel( "Artist" );
//Label_Composer_ID3V2 = new JLabel( "Composer" );
Label_Album_ID3V2 = new JLabel( "Album" );
Label_Comment_ID3V2 = new JLabel( "Comment" );
Label_Genre_ID3V2 = new JLabel( "Genre" );
fix_ID3V2 = new JButton( "Fix" );
reset_ID3V2 = new JButton( "Reset" );
reset_ID3V2.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
// TODO reset to defaults
refreshID3v2();
}
});
addfixlistener();
gridPane_ID3V2.add( Label_Title_ID3V2 );
gridPane_ID3V2.add( Text_Title_ID3V2 );
gridPane_ID3V2.add( Label_Year_ID3V2 );
gridPane_ID3V2.add( Text_Year_ID3V2 );
gridPane_ID3V2.add( Label_Artist_ID3V2 );
gridPane_ID3V2.add( Text_Artist_ID3V2 );
//gridPane_ID3V2.add( Label_Composer_ID3V2 );
//gridPane_ID3V2.add( Text_Composer_ID3V2 );
gridPane_ID3V2.add( Label_Album_ID3V2 );
gridPane_ID3V2.add( Text_Album_ID3V2 );
gridPane_ID3V2.add( Label_Comment_ID3V2 );
gridPane_ID3V2.add( Text_Comment_ID3V2 );
gridPane_ID3V2.add( Label_Genre_ID3V2 );
gridPane_ID3V2.add( Text_Genre_ID3V2 );
JScrollPane scrollPane_ID3V2 = new JScrollPane( gridPane_ID3V2 );
buttonPane_ID3V2.setLayout( new BoxLayout( buttonPane_ID3V2, BoxLayout.LINE_AXIS) );
buttonPane_ID3V2.add( fix_ID3V2 );
buttonPane_ID3V2.add( reset_ID3V2 );
boxPane_ID3V2.setLayout( new BoxLayout( boxPane_ID3V2, BoxLayout.PAGE_AXIS) );
boxPane_ID3V2.add( scrollPane_ID3V2 );
boxPane_ID3V2.add( buttonPane_ID3V2 );
tabPane.add( "ID3V2" , boxPane_ID3V2 );
side_panel.add(tabPane);
//////////////////////////////// lyrics ///////////////////////////////////////
lyrics_title = new JLabel("Lyrics\n",JLabel.CENTER);
Lyrics = "lyris preview";
lyrics_field = new JTextArea(Lyrics);
lyrics_field.setEditable(false);
side_panel_scroll = new JScrollPane(lyrics_field);
side_panel_scroll.setPreferredSize(new Dimension(250,300));
side_panel.add(side_panel_scroll);
Border border = BorderFactory.createEtchedBorder(EtchedBorder.RAISED);
side_panel.setBorder(border);
}
public void addfixlistener(){
fix_ID3V1.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if( currentRowIndex >= 0 ){
MP3FILE temp = filevector.get(currentRowIndex);
try{
temp.id3v1tag.setAlbumTitle(Text_Album_ID3V1.getText());
temp.id3v1tag.setArtist(Text_Artist_ID3V1.getText());
temp.id3v1tag.setYearReleased(Text_Year_ID3V1.getText());
temp.id3v1tag.setTitle(Text_Title_ID3V1.getText());
temp.id3v1tag.setSongComment(Text_Comment_ID3V1.getText());
//temp.id3v1tag.setAuthorComposer(Text_Composer_ID3V1.getText());
temp.id3v1tag.setSongGenre(Text_Genre_ID3V1.getText());
temp.mp3_file.setID3v1Tag(temp.id3v1tag);
temp.mp3_file.save();
refreshID3v1();
}catch( Exception E ){
}
}else
return;
}
});
fix_ID3V2.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if( currentRowIndex >= 0 ){
MP3FILE temp = filevector.get( currentRowIndex );
try{
temp.id3v2tag.setAlbumTitle(Text_Album_ID3V2.getText());
temp.id3v2tag.setLeadArtist(Text_Artist_ID3V2.getText());
temp.id3v2tag.setYearReleased(Text_Year_ID3V2.getText());
temp.id3v2tag.setSongTitle(Text_Title_ID3V2.getText());
temp.id3v2tag.setSongComment(Text_Comment_ID3V2.getText());
//temp.id3v2tag.setAuthorComposer(Text_Composer_ID3V2.getText());
temp.id3v2tag.setSongGenre(Text_Genre_ID3V2.getText());
temp.mp3_file.setID3v2Tag(temp.id3v2tag);
temp.mp3_file.save();
update( currentRowIndex );
refreshID3v2( );
}catch( Exception E ){
}
}else
return;
}
});
}
private void constructFrame()
{
setLayout( new BoxLayout(this.getContentPane(), BoxLayout.LINE_AXIS) );
setTitle("Music Tagger");
pack();
filevector = new Vector<MP3FILE>();
setJMenuBar( menu_bar );
add(table_panel);
add(side_panel);
setSize( 1350,700 );
setVisible(true);
}
//////////////////////////////////////////////////////////////////
private void createFileMenu()
{
menu_file = new JMenu("File");
menu_file.setMnemonic('F');
file_open = new JMenuItem("Open File...");
file_exit = new JMenuItem("Exit");
menu_file.add(file_open);
menu_file.add(file_exit);
menu_bar.add(menu_file);
filechooser.setMultiSelectionEnabled(true);
file_open.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
int returnVal = filechooser.showOpenDialog(file_open);
if ( returnVal == JFileChooser.APPROVE_OPTION ) {
File currentFile[] = filechooser.getSelectedFiles();
int len = currentFile.length;
String filename;
MP3FILE mp3;
for( int i = 0; i < len; i++ ){
filename = currentFile[ i ].getName();
String extension = filename.substring(filename.lastIndexOf(".") + 1, filename.length());
String mp3extension = "mp3";
if (extension.compareTo(mp3extension) != 0) {
JOptionPane.showMessageDialog(null, "Currently We only support MP3 menu_file");
}else{
try {
mp3 = new MP3FILE( currentFile[ i ] );
filevector.add( mp3 );
DefaultTableModel model = (DefaultTableModel) table_panel_table.getModel();
model.addRow(new Object[]{ mp3.mp3_filename,mp3.id3v2tag.getSongTitle(), mp3.id3v2tag.getLeadArtist() , mp3.id3v2tag.getAlbumTitle() , mp3.id3v2tag.getYearReleased() , mp3.id3v2tag.getSongComment() });
System.out.println("insert file " + currentFile[i].getName() + " filevector size: " + filevector.size());
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
} else {}
}
});
file_exit.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
System.exit(0);
}
});
}
private void createEditMenu()
{
menu_edit = new JMenu("Edit");
menu_edit.setMnemonic('E');
edit_fix_all = new JMenuItem("Fix All");
edit_tag = new JMenuItem("Fix Selected");
edit_delete = new JMenuItem("Delete");
edit_select_all = new JMenuItem("Select All");
edit_clean = new JMenuItem("Clean");
menu_edit.add(edit_fix_all);
menu_edit.add(edit_tag);
menu_edit.add(edit_delete);
menu_edit.add(edit_select_all);
menu_edit.add(edit_clean);
menu_bar.add(menu_edit);
edit_fix_all.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
int totalRows = table_panel_table.getRowCount();
progress_bar.setString("batch fixing...");
progress_bar.update(progress_bar.getGraphics());
for ( int row = 0; row < totalRows; row++ ){
try{
filevector.get(row).get_correct_tag();
update( row );
}catch( Exception E ){
E.printStackTrace();
}
progress_bar.setValue((int)((row+1)/(double)totalRows*100));
progress_bar.update(progress_bar.getGraphics());
}
progress_bar.setString("batch fixing done");
progress_bar.setValue(0);
progress_bar.update(progress_bar.getGraphics());
refreshID3v1();
refreshID3v2();
refreshCover();
refreshLyrics();
}
});
edit_tag.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
// TODO
progress_bar.setString("fixing...");
progress_bar.update(progress_bar.getGraphics());
for( int i = 0 ; i < selectedRowCount ; i++ ){
try{
filevector.get(selectedRows[i]).get_correct_tag();
update(selectedRows[i]);
}catch( Exception e1 ){
}
progress_bar.setValue((int)((i+1)/(double)selectedRowCount*100));
progress_bar.update(progress_bar.getGraphics());
}
progress_bar.setString("fixing done");
progress_bar.setValue(0);
progress_bar.update(progress_bar.getGraphics());
refreshID3v1();
refreshID3v2();
refreshCover();
refreshLyrics();
}
});
edit_delete.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
while( table_panel_table.getSelectedRowCount() > 0 ){
int index = table_panel_table.getSelectedRow();
DefaultTableModel model = (DefaultTableModel)table_panel_table.getModel();
filevector.removeElementAt( index );
model.removeRow(index);
}
}
});
edit_select_all.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
table_panel_table.setRowSelectionInterval( 0 , table_panel_table.getRowCount() - 1 );
}
});
//clean table entry
edit_clean.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
int rowcount;
while( (rowcount = table_panel_table.getRowCount()) > 0 ){
DefaultTableModel model = (DefaultTableModel)table_panel_table.getModel();
filevector.remove(rowcount - 1);
model.removeRow(rowcount - 1);
}
}
});
}
private void createPopup()
{
popup=new JPopupMenu();
popup_fixall=new JMenuItem("Fix All");
popup_tag = new JMenuItem("Fix selected");
popup_delete = new JMenuItem("Delete");
popup_selectall = new JMenuItem("Select All");
popup_clean = new JMenuItem("Clean");
popup.add(popup_fixall);
popup.add(popup_tag);
popup.add(popup_delete);
popup.add(popup_selectall);
popup.add(popup_clean);
popup_fixall.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
int totalRows = table_panel_table.getRowCount();
progress_bar.setString("Batch Fixing...");
progress_bar.update(progress_bar.getGraphics());
for ( int row = 0; row < totalRows; row++ ){
try{
filevector.get(row).get_correct_tag();
update( row );
}catch( Exception E ){
E.printStackTrace();
}
progress_bar.setValue((int)((row+1)/(double)totalRows*100));
progress_bar.update(progress_bar.getGraphics());
}
progress_bar.setString("Batch Fixing Done");
progress_bar.setValue(0);
progress_bar.update(progress_bar.getGraphics());
refreshID3v1();
refreshID3v2();
refreshCover();
refreshLyrics();
}
});
popup_delete.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e ){
while( table_panel_table.getSelectedRowCount() > 0 ){
int index = table_panel_table.getSelectedRow();
DefaultTableModel model = (DefaultTableModel)table_panel_table.getModel();
filevector.removeElementAt( index );
model.removeRow(index);
}
}
});
popup_selectall.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
table_panel_table.setRowSelectionInterval( 0 , table_panel_table.getRowCount() - 1 );
}
});
popup_clean.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
int rowcount;
while( (rowcount = table_panel_table.getRowCount()) > 0 ){
DefaultTableModel model = (DefaultTableModel)table_panel_table.getModel();
filevector.remove(rowcount - 1);
model.removeRow(rowcount - 1);
}
}
});
popup_tag.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
// TODO
progress_bar.setString("Fixing...");
progress_bar.update(progress_bar.getGraphics());
for( int i = 0 ; i < selectedRowCount ; i++ ){
try{
filevector.get(selectedRows[i]).get_correct_tag();
update(selectedRows[i]);
}catch( Exception e1 ){
}
progress_bar.setValue((int)((i+1)/(double)selectedRowCount*100));
progress_bar.update(progress_bar.getGraphics());
}
progress_bar.setString("Fixing Done");
progress_bar.setValue(0);
progress_bar.update(progress_bar.getGraphics());
refreshID3v1();
refreshID3v2();
refreshCover();
refreshLyrics();
}
});
}
//////////////////// Helper Methods /////////////////////
private void update ( int row )
{
int column = 0;
DefaultTableModel model = (DefaultTableModel) table_panel_table.getModel();
model.setValueAt( filevector.get( row ).mp3_filename , row , column++ );
model.setValueAt( filevector.get( row ).id3v2tag.getSongTitle() , row , column++ );
model.setValueAt( filevector.get( row ).id3v2tag.getLeadArtist() , row , column++ );
model.setValueAt( filevector.get( row ).id3v2tag.getAlbumTitle() , row , column++ );
model.setValueAt( filevector.get( row ).id3v2tag.getYearReleased() , row , column++ );
model.setValueAt( filevector.get( row ).id3v2tag.getSongComment() , row , column );
}
private int refreshID3v1()
{
if( currentRowIndex >= 0 ){
int index = currentRowIndex;
Text_Album_ID3V1.setText(filevector.get(index).id3v1tag.getAlbum());
Text_Artist_ID3V1.setText(filevector.get(index).id3v1tag.getArtist());
Text_Comment_ID3V1.setText(filevector.get(index).id3v1tag.getComment());
Text_Title_ID3V1.setText(filevector.get(index).id3v1tag.getSongTitle());
Text_Year_ID3V1.setText(filevector.get(index).id3v1tag.getYear());
//Text_Composer_ID3V1.setText(filevector.get(index).id3v1tag.getAuthorComposer());
Text_Genre_ID3V1.setText(filevector.get(index).id3v1tag.getSongGenre());
}else{
Text_Album_ID3V1.setText("");
Text_Artist_ID3V1.setText("");
Text_Comment_ID3V1.setText("");
Text_Title_ID3V1.setText("");
Text_Year_ID3V1.setText("");
//Text_Composer_ID3V1.setText("");
Text_Genre_ID3V1.setText("");
}
return 0;
}
private int refreshID3v2()
{
if( currentRowIndex >= 0 ){
int index = currentRowIndex;
Text_Album_ID3V2.setText(filevector.get(index).id3v2tag.getAlbumTitle());
Text_Artist_ID3V2.setText(filevector.get(index).id3v2tag.getLeadArtist());
Text_Comment_ID3V2.setText(filevector.get(index).id3v2tag.getSongComment());
Text_Title_ID3V2.setText(filevector.get(index).id3v2tag.getSongTitle());
Text_Year_ID3V2.setText(filevector.get(index).id3v2tag.getYearReleased());
//Text_Composer_ID3V2.setText(filevector.get(index).id3v2tag.getAuthorComposer());
Text_Genre_ID3V2.setText(filevector.get(index).id3v2tag.getSongGenre());
}else{
Text_Album_ID3V2.setText("");
Text_Artist_ID3V2.setText("");
Text_Comment_ID3V2.setText("");
Text_Title_ID3V2.setText("");
Text_Year_ID3V2.setText("");
//Text_Composer_ID3V2.setText("");
Text_Genre_ID3V2.setText("");
}
return 0;
}
private int refreshCover(){
if( currentRowIndex >= 0 ){
int index = currentRowIndex;
cover = filevector.get(currentRowIndex).cover;
if(cover == null)
cover = default_cover;
ImageIcon icon = new ImageIcon(cover);
album_art.setIcon(icon);
}
return 0;
}
private int refreshLyrics(){
if( currentRowIndex >= 0 ){
int index = currentRowIndex;
if( filevector.get(currentRowIndex).lyrics != null ){
Lyrics = new String(filevector.get(currentRowIndex).lyrics);
lyrics_field.setText(Lyrics);
}
else{
Lyrics = "lyrics preview";
lyrics_field.setText(Lyrics);
}
}else{
Lyrics = "lyrics preview";
lyrics_field.setText(Lyrics);
}
return 0;
}
private class mp3structure{
public String FileName;
public String Title;
public String Artist;
public String Album;
public String Year;
public MP3FILE mp3;
public mp3structure( String filename , String title , String artist , String album , String year , MP3FILE m ){
FileName = filename;
Title = title;
Artist = artist;
Album = album;
Year = year;
mp3 = m;
}
}
private class comparefilename<T> implements Comparator<T>{
@Override
public int compare(T o1, T o2) {
// TODO Auto-generated method stub
mp3structure m1 = (mp3structure)o1;
mp3structure m2 = (mp3structure)o2;
return m1.FileName.compareTo(m2.FileName);
}
}
private class comparetitle<T> implements Comparator<T>{
@Override
public int compare(T o1, T o2) {
// TODO Auto-generated method stub
mp3structure m1 = (mp3structure)o1;
mp3structure m2 = (mp3structure)o2;
return m1.Title.compareTo(m2.Title) ;
}
}
private class compareartist<T> implements Comparator<T>{
@Override
public int compare(T o1, T o2) {
// TODO Auto-generated method stub
mp3structure m1 = (mp3structure)o1;
mp3structure m2 = (mp3structure)o2;
return m1.Artist.compareTo(m2.Artist);
}
}
private class comparealbum<T> implements Comparator<T>{
@Override
public int compare(T o1, T o2) {
// TODO Auto-generated method stub
mp3structure m1 = (mp3structure)o1;
mp3structure m2 = (mp3structure)o2;
return m1.Album.compareTo(m2.Album);
}
}
private class compareyear implements Comparator{
@Override
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
mp3structure m1 = (mp3structure)o1;
mp3structure m2 = (mp3structure)o2;
int y1 = Integer.parseInt(m1.Year);
int y2 = Integer.parseInt(m2.Year);
if( y1 > y2 ) return 1;
else if( y1 < y2 ) return -1;
return 0;
}
}
private class transfer_frame extends JFrame{
private JFrame itself;
public JTable file_list_table;
public JScrollPane file_pane;
public JPanel button_panel;
public JButton browse_button,wifi_syn_button,synchronize_button,cancel_button,delete_button;
public JLabel progress_log;
public Vector<File> file_list;
private final JFileChooser fileselector = new JFileChooser();
public transfer_frame( Vector<File> chosen_files ){
super();
itself = this;
construct_button_panel();
construct_list_table(chosen_files);
construct_log();
setLayout( new BorderLayout() );
add(file_pane,BorderLayout.CENTER);
add(button_panel,BorderLayout.NORTH);
add(progress_log,BorderLayout.SOUTH);
setTitle("File Transfer");
pack();
setSize( 700,400 );
setVisible(true);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent event){
itself.dispose();
}
});
}
private void construct_button_panel(){
fileselector.setMultiSelectionEnabled(true);
button_panel = new JPanel();
button_panel.setLayout(new BoxLayout(button_panel,BoxLayout.LINE_AXIS));
browse_button = new JButton(" Browse ");
wifi_syn_button = new JButton("WIFI Syn");
synchronize_button = new JButton("Synchronize");
cancel_button = new JButton(" Cancel ");
delete_button = new JButton(" Delete ");
browse_button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
int returnVal = fileselector.showOpenDialog(file_list_table);
if ( returnVal == JFileChooser.APPROVE_OPTION ) {
File currentFile[] = fileselector.getSelectedFiles();
int len = currentFile.length;
String filename;
File mp3;
for( int i = 0; i < len; i++ ){
//filename = currentFile[ i ].getName();
//String extension = filename.substring(filename.lastIndexOf(".") + 1, filename.length());
//String mp3extension = "mp3";
//if (extension.compareTo(mp3extension) != 0) {
// JOptionPane.showMessageDialog(null, "Currently We only support MP3 menu_file");
//}else{
file_list.add(currentFile[i]);
DefaultTableModel model = (DefaultTableModel) file_list_table.getModel();
model.addRow(new Object[]{ currentFile[i].getName(), currentFile[i].getParent()});
//}
}
} else {}
}
});
cancel_button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
itself.dispose();
}
});
delete_button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
DefaultTableModel model = (DefaultTableModel) file_list_table.getModel();
while( file_list_table.getSelectedRowCount() > 0 ){
file_list.remove(file_list_table.getSelectedRow());
model.removeRow(file_list_table.getSelectedRow());
}
}
});
wifi_syn_button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
ServerSocket server = null;
try {
Socket clientSocket;
int port = Integer.parseInt(JOptionPane.showInputDialog("Enter Port Number", "8000"));
server = new ServerSocket(port);
clientSocket = server.accept();
int length = file_list.size();
DataOutputStream dataoutput = new DataOutputStream(clientSocket.getOutputStream());
dataoutput.writeInt(length);
Iterator<File> f = file_list.iterator();
File transfer_file;
progress_log.setText("FILE SYNCHRONIZING PLEASE WAIT");
while( f.hasNext() ){
transfer_file = f.next();
String name = transfer_file.getName();
int namelength = name.length();
long size = transfer_file.length();
System.out.println(size);
FileInputStream input = new FileInputStream(transfer_file);
byte[] data = new byte[(int)size];
input.read(data);
dataoutput.writeInt(namelength);
for( int i = 0 ; i < namelength ; i++ ){
dataoutput.writeChar(name.charAt(i));
}
dataoutput.writeLong(size);
for ( int j = 0 ; j < size ; j++ ){
dataoutput.writeByte(data[j]);
}
}
dataoutput.close();
clientSocket.close();
server.close();
progress_log.setText("FILE SYNCHRONIZATION DONE");
} catch (IOException e1) {
// TODO Auto-generated catch block
//e1.printStackTrace();
System.out.println("error wifi sync");
try{
if(server != null)
server.close();
}catch(Exception e3){
}
}
}
});
synchronize_button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Socket socket;
try{
socket = new Socket("sslab04.cs.purdue.edu",8080);
int length = file_list.size();
DataOutputStream dataoutput = new DataOutputStream(socket.getOutputStream());
dataoutput.writeInt(1);
dataoutput.writeInt(length);
Iterator<File> f = file_list.iterator();
File transfer_file;
progress_log.setText("FILE SYNCHRONIZING PLEASE WAIT");
while( f.hasNext() ){
transfer_file = f.next();
String name = transfer_file.getName();
int namelength = name.length();
long size = transfer_file.length();
FileInputStream input = new FileInputStream(transfer_file);
byte[] data = new byte[(int)size];
System.out.println(data.length);
input.read(data);
input.close();
dataoutput.writeInt(namelength);
for( int i = 0 ; i < namelength ; i++ ){
dataoutput.writeChar(name.charAt(i));
}
dataoutput.writeLong(size);
for ( int j = 0 ; j < size ; j++ ){
dataoutput.writeByte(data[j]);
}
}
dataoutput.close();
socket.close();
progress_log.setText("FILE SYNCHRONIZATION DONE");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
button_panel.add(wifi_syn_button);
button_panel.add(synchronize_button);
button_panel.add(browse_button);
button_panel.add(cancel_button);
button_panel.add(delete_button);
}
public void construct_list_table(Vector<File> chosen_files){
file_list = new Vector<File>(chosen_files);
file_list_table = new JTable(new DefaultTableModel( new Object[][]{}, new String[]{"Music Name","Directory"} ){
public boolean isCellEditable(int rowIndex, int colIndex) {
return false;
}
});
file_list_table.setCellSelectionEnabled(false);
file_list_table.setRowSelectionAllowed(true);
file_pane = new JScrollPane(file_list_table);
DefaultTableModel model = (DefaultTableModel)file_list_table.getModel();
Iterator<File> f = file_list.iterator();
while( f.hasNext() ){
File file = f.next();
model.addRow(new Object[]{file.getName(),file.getParent()});
}
}
public void construct_log(){
progress_log = new JLabel();
progress_log.setVisible(true);
progress_log.setText("FILE SYNCHRONIZATION");
}
}
}